package cn.biplam.common.bean.tool.flat;

import java.util.ArrayList;
import java.util.List;

import cn.biplam.common.bean.Bean;
import cn.biplam.common.client.DbResource;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.treeFlat.flat.callback.CompareCallback;
import cn.biplam.common.wrapper.treeFlat.flat.callback.OperatorTypeFilterCallback;
import cn.biplam.common.wrapper.treeFlat.flat.callback.ParentFieldNameCallback;
import cn.biplam.common.wrapper.treeFlat.pcTree.callback.OperatorTypeCallback;

/**
 *  父子关系表到平面关系表转换器<BR>
 *  <P>用法:<BR>
 *    1 创建转换器(父子表表名称,父子表数据源)<BR>
 *    2 设置父子表对应父子关系的字段名 setPcFieldMap(ID字段名,父亲ID字段名,名称字段,级别字段)<BR>
 *    3 (可选)设置父子关系表附加字段名称 putAddFields(List)<BR>
 *    4 (可选)设置被过滤的节点     setDataFilter(List)<BR>
 *    
 *   5 (可选)设置平面表表名   setTargetTableName()<B>如果未设置平面表表名为：父子表表名+"_Flat"</B><BR>
 *   6 (可选)设置平面表数据源 setTargetDbResource()<B>如果未设置平面表数据源为父子表数据源</B><BR>
 *   7 (可选)设置平面化后数据过滤条件 setOperatorTypeFilterCallback,setOperatorTypeFieldName,根据节点类型过滤<BR>
 *  </P>
 * @author XiaoRuxing Nov 28, 20093:22:48 PM
 * @version 1.0
 */
public abstract class PcTableToFlatTable extends Bean {

	/**
	 *  设置父子表字段名称映射<BR>
	 *  记录ID,父亲ID,节点名称和业务级别对应的字段名称
	 * @param nodeIdField     记录ID字段名
	 * @param nodeParentIdField 父亲ID字段名
	 * @param nodeNameField   节点名称字段名
	 * @param nodeLevelField  业务级别字段名(可以为空)
	 */
	public abstract void setPcFieldMap(String nodeIdField,
			String nodeParentIdField,
			String nodeNameField, 
			String nodeLevelField);
	
	/**
	 *  放入附加数据字段
	 * @param field 附加数据字段(一个附加字段的情况下使用)
	 */
	public abstract void putAddFields(String field);
	
	/**
	 *  放入附加数据字段
	 * @param fields 附加数据字段(可以是一个或者多个字段,此方法可以多次调用)
	 */
	public abstract void putAddFields(OperatorTypeCallback operatorFields,
			String... fields);
	
	/**
	 * 设置过滤数据列表 
	 * @param filterList 被过滤的节点列表(存储的内容为节点ID)
	 */
	public abstract void setDataFilter(List<String> filterList);
	
	/**
	 *  设置根节点条件回调器
	 * @param parentCallback 根节点条件回调器
	 */
	public abstract void setRootNodeCallBack(CompareCallback parentCallback);
	
	/**
	 *  设置目标表表名称
	 * @param tableName 表名称
	 */
	public abstract void setTargetTableName(String tableName);
	
	/**
	 *  设置目标数据源
	 * @param trgDb 目标数据源
	 */
	public abstract void setTargetDbResource(DbResource trgDb);
	
	/**
	 *  设置父亲们字段名称回调器<BR>
	 *  生成每个父亲的ID和名称字段名
	 * @param parentFieldNameCallback 父亲们字段名称回调器
	 */
	public abstract void setParentFieldNameCallback(
			ParentFieldNameCallback parentFieldNameCallback);
	
	/**
	 *  设置节点操作类型字段名称
	 * @param operatorTypeFieldName 节点操作类型字段
	 */
	public abstract void setOperatorTypeFieldName(String operatorTypeFieldName);
	
	/**
	 *  设置节点操作类型过滤回调器
	 */
	public abstract void setOperatorTypeFilterCallback(OperatorTypeFilterCallback callback);
	
	/**
	 *  
	 * @return 平面表名称
	 */
	public abstract String getFlatTableName();
	
	/**
	 *  
	 * @return 获取平面表字段列表
	 */
	public abstract ArrayList<String> getFieldList();
	
	/**
	 *  
	 * @return 执行数据转换
	 * @throws ErrorMessage 
	 */
	public abstract boolean execute() throws ErrorMessage;
	
	/**
	 *  新建实例
	 * @param tableName 表名称
	 * @param dbReource 数据源
	 * @return 父子关系表到平面关系表转换
	 * @throws ErrorMessage
	 */
	public static PcTableToFlatTable getNewInstance(String tableName,
			DbResource dbReource) throws ErrorMessage {
		return (PcTableToFlatTable) get(PcTableToFlatTable.class.getSimpleName(), tableName , dbReource);
	}
}
